In C#, how to determine if a class or an instance of the class implements an interface
I needed to determine if a class or one of its instances implements and interface. So I created this test project to see if this works.
Turns out it is really easy to do. Here is a test project that I used to learn. Just create a new console project and stick this code in the Program.cs and check it out.
namespace TestIfThisImplementsInterface { class Program { static void Main(string[] args) { // Test if the type or its parent implements the interface bool bCarClass = typeof(IDrivable).IsAssignableFrom(typeof(Car)); // True bool bFordFocusClass = typeof(IDrivable).IsAssignableFrom(typeof(FordFocus)); // True bool bJunkerClass = typeof(IDrivable).IsAssignableFrom(typeof(Junker)); // False // Test if the exact type and not its parent implements the derived type bool bCarClassEx = typeof(Car).GetInterface(typeof(IDrivable).FullName) != null; // True bool bFordFocusClassEx = typeof(Vehicle).GetInterface(typeof(IDrivable).FullName) != null; // False bool bJunkerClassEx = typeof(Junker).GetInterface(typeof(IDrivable).FullName) != null; // True // Test if an instance implements or derivces from an oject that implements the interface bool bCarInstance = new Car() is IDrivable; // True bool bFordFocusInstance = new FordFocus() is IDrivable; // True bool bJunkerInstance = new Junker() is IDrivable; // False // Test if an instance implements or derivces from an oject that implements the interface bool bCarInstanceEx = new Car().GetType().GetInterface(typeof(IDrivable).FullName) != null; // True bool bFordFocusInstanceEx = new FordFocus().GetType().GetInterface(typeof(IDrivable).FullName) != null; // False bool bJunkerInstanceEx = new Junker().GetType().GetInterface(typeof(IDrivable).FullName) != null; // False // Show that the test can be in the parent class but the actual class is what is tested // This is actually what I needed. Glad it worked! bool bCarParentFunction = new Car().IsDrivable; // True bool bFordFocusParentFunction = new FordFocus().IsDrivable; // True bool bJunkerParentFunction = new Junker().IsDrivable; // False } } public interface IDrivable { void Drive(); } public class Vehicle { public virtual bool IsDrivable { get { return this is IDrivable; } } } public class Car : Vehicle, IDrivable { #region IDrivable Members public void Drive() { // Drive code here } #endregion } public class FordFocus : Car { } public class Junker : Vehicle { } }
Resource:
http://www.hanselman.com/blog/DoesATypeImplementAnInterface.aspx